#include <iostream>
#include <memory>
#include <algorithm>
#include "Log.hpp"
#include "Tcp_Server.hpp"
#include "Translate.hpp"


using namespace std;


void Usage(std::string proc)
{
    std::cout << "Usage : \n\t" << proc << " local_port\n"
              << std::endl;
}

Translate trans;

//交互
void Interact(int sockfd,string &out,const string &in)
{
    char buff[1024];
    ssize_t n = read(sockfd, buff, sizeof(buff) - 1); // 读进来
    if (n > 0)
    {
        buff[n] = 0;
        write(sockfd, in.c_str(), in.size()); // 写出去
    }
    else if (n == 0) // 返回值为0，表示对端关闭了连接
    {
        lg.LogMessage(Info, "对端关闭了连接\n");
        
    }
    else
    {
        lg.LogMessage(Info, "读消息失败： %d,error string: %s\n", errno, strerror(errno));
        
    }
}



// 未来的服务器是部署在你的云服务器上的，你怎么知道你的服务未来在任何一个时刻，都是健康的呢？？
// 我可以定期(30s)向我的服务器发送最小服务请求，如果得到了回复，说明我们的服务是正常的.
// 这个机制，我们称之为心跳机制.我们可以问client->服务器, 反向的 server->client
void Ping(int sockfd, InetAddr addr)
{
    lg.LogMessage(Debug, "%s select %s success, fd : %d\n", addr.PrintDebug().c_str(), "ping", sockfd);
    string message;
    Interact(sockfd,message,"Pong");
}
void Translate_S(int sockfd, InetAddr addr)
{
    lg.LogMessage(Debug, "%s select %s success, fd : %d\n", addr.PrintDebug().c_str(), "Translate", sockfd);
    //string word;
    char wordbuff[128];
    int n =read(sockfd,wordbuff,sizeof(wordbuff)-1);
    if(n>0)wordbuff[n]=0;
    std::string chinese=trans.Excute(wordbuff);
    write(sockfd,chinese.c_str(),chinese.size());

    lg.LogMessage(Debug, "%s Translate ,%s->%s\n",addr.PrintDebug().c_str(),wordbuff,chinese.c_str());

}

void Transform(int sockfd, InetAddr addr)
{
    lg.LogMessage(Debug, "%s select %s success, fd : %d\n", addr.PrintDebug().c_str(), "Transform", sockfd);
    char message[128];
    int n= read(sockfd,message,sizeof(message)-1);
    if(n>0) message[n]=0;
    string messagebuf=message;
    transform(messagebuf.begin(),messagebuf.end(),messagebuf.begin(),[](unsigned char c)
    {
        return toupper(c);
    });
    write(sockfd,messagebuf.c_str(),messagebuf.size());
}


int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
        return Usage_Err;
    }
    uint16_t port = stoi(argv[1]);

    unique_ptr<TcpServer> tsvr = make_unique<TcpServer>(port);

    tsvr->RegisterFunc("ping", Ping);
    tsvr->RegisterFunc("translate", Translate_S);
    tsvr->RegisterFunc("transform", Transform);

    tsvr->Init();

    tsvr->Start();

    return 0;
}
